/**
 * @file  NM25Q128_ins.h
 * @brief NM25Q128EVB (128M-bit/16MB) SPI Flash指令集 - 遵循诺存微电子数据手册Rev1.0
 * @note  指令分类按照手册Table7(阵列访问)、Table8(设备操作)、Table9(寄存器访问)整理
 */

#ifndef __NM25Q128_INS_H
#define __NM25Q128_INS_H

/*==========================================================================
 * 标准SPI指令集 (1-1-1模式)
 * 格式说明：[指令字节] [地址/数据字节]...[dummy周期] [输出数据]
 *=========================================================================*/

/*------------------ 基本控制指令 -----------------*/
#define NM25Q128_WRITE_ENABLE                 0x06 // 写使能 (无后续字节)
#define NM25Q128_VOLATILE_SR_WRITE_ENABLE     0x50 // 易失性状态寄存器写使能
#define NM25Q128_WRITE_DISABLE                0x04 // 写禁止 (无后续字节)
#define NM25Q128_DUMMY_BYTE                   0xFF // 为读写提供时钟脉冲

/*------------------ 设备识别指令 -----------------*/
// 9Fh指令格式：[9Fh][3 dummy][MF7-MF0][ID15-ID8][ID7-ID0]
#define NM25Q128_JEDEC_ID                     0x9F 

// ABh指令格式：[ABh][3 dummy][D7-D0] (需先执行RSTEN 66h)
#define NM25Q128_RELEASE_POWER_DOWN_ID        0xAB 

// 90h指令格式：[90h][2 dummy][00h][MF7-MF0][ID7-ID0]
#define NM25Q128_MANUFACTURER_DEVICE_ID       0x90 

// 92h(双线)/94h(四线)指令格式同90h，dummy周期不同
#define NM25Q128_MANUFACTURER_ID_DUAL_IO      0x92 
#define NM25Q128_MANUFACTURER_ID_QUAD_IO      0x94 

/*------------------ 数据读取指令 -----------------*/
// 03h指令格式：[03h][A23-A16][A15-A8][A7-A0][连续输出数据]
#define NM25Q128_READ_DATA                    0x03 

// 0Bh指令格式：[0Bh][A23-A16][A15-A8][A7-A0][8 dummy][连续输出数据]
#define NM25Q128_FAST_READ                    0x0B 

// 3Bh(双输出)/6Bh(四输出)指令格式类似，dummy周期不同
#define NM25Q128_DUAL_OUTPUT_READ             0x3B 
#define NM25Q128_QUAD_OUTPUT_READ             0x6B 

// BBh(双I/O)/EBh(四I/O)指令格式
#define NM25Q128_DUAL_IO_READ                 0xBB 
#define NM25Q128_QUAD_IO_READ                 0xEB 

/*------------------ 编程指令 ---------------------*/
// 02h指令格式：[02h][A23-A16][A15-A8][A7-A0][输入数据...](最多256字节)
#define NM25Q128_PAGE_PROGRAM                 0x02 

// 32h四线编程指令
#define NM25Q128_QUAD_PAGE_PROGRAM            0x32 

/*------------------ 擦除指令 ---------------------*/
#define NM25Q128_SECTOR_ERASE_4KB             0x20 // [20h][A23-A16][A15-A8][A7-A0]
#define NM25Q128_BLOCK_ERASE_32KB             0x52 // [52h][A23-A16][A15-A8][A7-A0]
#define NM25Q128_BLOCK_ERASE_64KB             0xD8 // [D8h][A23-A16][A15-A8][A7-A0]
#define NM25Q128_CHIP_ERASE                   0x60 // 全片擦除(或C7h)

/*------------------ 状态寄存器指令 ----------------*/
#define NM25Q128_READ_STATUS_REG_1            0x05 // [05h][S7-S0]
#define NM25Q128_WRITE_STATUS_REG_1           0x01 // [01h][S7-S0]
#define NM25Q128_READ_STATUS_REG_2            0x35 // [35h][S15-S8]
#define NM25Q128_WRITE_STATUS_REG_2           0x31 // [31h][S15-S8]
#define NM25Q128_READ_STATUS_REG_3            0x15 // [15h][S23-S16]
#define NM25Q128_WRITE_STATUS_REG_3           0x11 // [11h][S23-S16]

/*------------------ 安全寄存器指令 ----------------*/
#define NM25Q128_ERASE_SECURITY_REG           0x44 // [44h][A23-A16][A15-A8][A7-A0]
#define NM25Q128_PROGRAM_SECURITY_REG         0x42 // [42h][A23-A16][A15-A8][A7-A0][数据]
#define NM25Q128_READ_SECURITY_REG            0x48 // [48h][A23-A16][A15-A8][A7-A0][8 dummy][数据]

/*------------------ 块保护指令 --------------------*/
#define NM25Q128_GLOBAL_BLOCK_LOCK            0x7E // 全局块锁定
#define NM25Q128_GLOBAL_BLOCK_UNLOCK          0x98 // 全局块解锁
#define NM25Q128_READ_BLOCK_LOCK              0x3D // [3Dh][A23-A16][A15-A8][A7-A0][L7-L0]
#define NM25Q128_INDIVIDUAL_BLOCK_LOCK        0x36 // [36h][A23-A16][A15-A8][A7-A0]
#define NM25Q128_INDIVIDUAL_BLOCK_UNLOCK      0x39 // [39h][A23-A16][A15-A8][A7-A0]

/*------------------ QPI模式指令 -------------------*/
#define NM25Q128_ENABLE_QPI_MODE              0x38 // 使能QPI模式
#define NM25Q128_RESET_QPI_MODE               0xFF // 复位QPI模式

/*------------------ 其他控制指令 ------------------*/
#define NM25Q128_ERASE_PROGRAM_SUSPEND        0x75 // 擦除/编程暂停
#define NM25Q128_ERASE_PROGRAM_RESUME         0x7A // 擦除/编程恢复
#define NM25Q128_POWER_DOWN                   0xB9 // 进入低功耗模式
#define NM25Q128_ENABLE_RESET                 0x66 // 使能复位(需后跟99h)
#define NM25Q128_RESET_DEVICE                 0x99 // 设备复位(需前接66h)
#define NM25Q128_SET_BURST_WITH_WRAP          0x77 // 设置突发换行参数
#define NM25Q128_SET_READ_PARAMETERS          0xC0 // 设置读取参数

/*==========================================================================
 * SFDP相关指令
 *=========================================================================*/
#define NM25Q128_READ_SFDP                    0x5A // [5Ah][A23-A16][A15-A8][A7-A0][8 dummy][输出数据]

/*==========================================================================
 * 通用定义
 *=========================================================================*/
/* 存储器参数 */
#define NM25Q128_PAGE_SIZE     256     // 页大小(字节)
#define NM25Q128_SECTOR_SIZE   4096    // 扇区大小(字节)
#define NM25Q128_BLOCK32K_SIZE 32768   // 32K块大小
#define NM25Q128_BLOCK64K_SIZE 65536   // 64K块大小
#define NM25Q128_CAPACITY      0x1000000 // 16MB (0x000000-0xFFFFFF)

/* 状态寄存器位定义 */
#define NM25Q128_SR1_BUSY_BIT  0x01    // SR1[0]: 忙状态位
#define NM25Q128_SR1_WEL_BIT   0x02    // SR1[1]: 写使能锁存位
#define NM25Q128_SR2_QE_BIT    0x02    // SR2[1]: QPI模式使能位

#endif /* __NM25Q128_INS_H */
